[프로그래머스] 키패드

https://programmers.co.kr/learn/courses/30/lessons/67256

문제

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

kakao_phone1.png

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

  • 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  • 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  • 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  • 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
  • 4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

풀이

핵심 로직을 간단하게 하기 위해서 map 컨테이너로 각 숫자의 좌표를 미리 정해두었다. 이 좌표를 기준으로 2, 5, 8, 0 이 나왔을 때는 현재 왼손과 오른손의 위치를 기준으로 거리를 계산하고, 아닐 때는 왼손, 오른손을 정답 문자열에 입력해준다.

코드

#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <iostream>

using namespace std;

int calcDist(pair<int, int> p1, pair<int, int> p2){
    return abs(p1.first-p2.first) + abs(p1.second-p2.second);
}

string solution(vector<int> numbers, string hand) {

    map<int, pair<int, int>> keypads = {
        {1, {0, 0}}, {2, {0, 1}}, {3, {0, 2}},
        {4, {1, 0}}, {5, {1, 1}}, {6, {1, 2}},
        {7, {2, 0}}, {8, {2, 1}}, {9, {2, 2}},
        {-2, {3, 0}}, {0, {3, 1}}, {-1, {3, 2}}
    };

    int currLeft = -2;
    int currRight = -1;
    string answer = "";

    for (auto num : numbers){
        bool isRight = true;
        if (num == 1 || num == 4 || num == 7){
            isRight = false;
        }
        else if (num == 3 || num == 6 || num == 9){
            isRight = true;
        }
        else{
            int distFromLeft = calcDist(keypads[currLeft], keypads[num]);
            int distFromRight = calcDist(keypads[currRight], keypads[num]);

            if (distFromLeft < distFromRight){
                isRight = false;
            }
            else if (distFromLeft > distFromRight){
                isRight = true;
            }
            else if (hand.compare("right") == 0){
                isRight = true;
            }
            else{
                isRight = false;
            }
        }

        if(isRight){
            currRight = num;
            answer += 'R';
        }
        else{
            currLeft = num;
            answer += 'L';
        }
    }

    return answer;
}

전여훈
Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.